import os
import random
from datetime import datetime, timedelta
from app import create_app
from extensions import db
from models import User, Coach, Course, Activity, Post, Booking
from werkzeug.security import generate_password_hash

app = create_app()

def create_test_data():
    with app.app_context():
        # 清空现有数据（谨慎使用）
        # db.drop_all()
        # db.create_all()
        
        print("开始创建测试数据...")
        
        # 创建管理员用户
        if not User.query.filter_by(email='admin@example.com').first():
            admin = User(
                username='admin',
                email='admin@example.com',
                phone='13800138000',
                password_hash=generate_password_hash('admin123'),
                is_admin=True,
                created_at=datetime.utcnow()
            )
            db.session.add(admin)
            print("已创建管理员用户")
        
        # 创建普通用户
        if User.query.filter_by(is_admin=False).count() == 0:
            users = [
                User(
                    username=f'user{i}',
                    email=f'user{i}@example.com',
                    phone=f'1380013800{i}',
                    password_hash=generate_password_hash(f'password{i}'),
                    is_admin=False,
                    is_member=(i % 2 == 0),  # 一半用户是会员
                    member_since=datetime.utcnow() - timedelta(days=random.randint(1, 100)) if i % 2 == 0 else None,
                    created_at=datetime.utcnow() - timedelta(days=random.randint(1, 365))
                ) for i in range(1, 11)  # 创建10个用户
            ]
            db.session.add_all(users)
            print("已创建10个普通用户")
        
        # 创建教练
        if Coach.query.count() == 0:
            coaches = [
                Coach(name='张教练', introduction='资深潜水教练，拥有10年潜水经验，带领过上千名学员安全潜水。', 
                      photo='coach1.jpg', experience=10, specialty='深潜教学', availability=True),
                Coach(name='李教练', introduction='专注于初学者教学，耐心细致，让您轻松掌握潜水技巧。', 
                      photo='coach2.jpg', experience=8, specialty='初学者教学', availability=True),
                Coach(name='王教练', introduction='水下摄影专家，可以为您拍摄精美的水下照片和视频。', 
                      photo='coach3.jpg', experience=12, specialty='水下摄影', availability=True),
                Coach(name='赵教练', introduction='专业救生员出身，安全意识强，保障您的潜水安全。', 
                      photo='coach4.jpg', experience=6, specialty='安全保障', availability=True),
                Coach(name='陈教练', introduction='海洋生物学专业毕业，对海洋生态有深入研究，能为您讲解海洋生物知识。', 
                      photo='coach5.jpg', experience=7, specialty='海洋生物', availability=True),
            ]
            db.session.add_all(coaches)
            print("已创建5个教练")
        
        # 创建课程
        if Course.query.count() == 0:
            courses = [
                Course(name='体验潜水', description='适合初次接触潜水的朋友，在教练一对一指导下，体验海底世界的奇妙。无需任何经验，只需要会游泳即可参加。',
                      price=520, duration='30分钟', type='体验潜水', image='course1.jpg'),
                Course(name='执证潜水', description='适合已持有潜水证书的潜水员，在教练带领下探索更深更远的海域。根据人数包船出海，体验更丰富的潜点。',
                      price=1200, duration='半天', type='执证潜水', image='course2.jpg'),
                Course(name='开放水域潜水员课程', description='国际认可的入门级潜水证书课程，包含理论学习和实践训练，完成后可获得终身有效的潜水证书。',
                      price=5999, duration='3-5天', type='考证课程', image='course3.jpg'),
                Course(name='进阶潜水员课程', description='提升您的潜水技能，学习更多专业知识，完成后可获得进阶潜水员证书。',
                      price=7999, duration='5-7天', type='考证课程', image='course4.jpg'),
            ]
            db.session.add_all(courses)
            print("已创建4个课程")
        
        # 创建活动
        if Activity.query.count() == 0:
            activities = [
                Activity(title='外伶仃岛珊瑚礁探索', 
                        description='探索外伶仃岛周边的珊瑚礁生态系统，观察各种珊瑚和热带鱼类。适合初学者和有经验的潜水员。',
                        date=datetime.now() + timedelta(days=15), 
                        image='activity1.jpg',
                        price=899.0,
                        location='珠海市外伶仃岛',
                        highlights='专业教练指导\n全套装备提供\n水下拍照留念\n含午餐'),
                Activity(title='夜潜体验', 
                        description='体验夜间潜水的神秘感，观察夜间活跃的海洋生物，感受不同于白天的海底世界。',
                        date=datetime.now() + timedelta(days=7), 
                        image='activity2.jpg',
                        price=699.0,
                        location='深圳市大鹏新区南澳镇',
                        highlights='专业夜潜装备\n水下照明设备\n安全指导\n晚餐包含'),
                Activity(title='水下摄影工作坊', 
                        description='学习水下摄影技巧，捕捉海底世界的精彩瞬间。由专业水下摄影师指导，提供专业设备。',
                        date=datetime.now() + timedelta(days=21), 
                        image='activity3.jpg',
                        price=1299.0,
                        location='深圳市南澳西冲',
                        highlights='专业水下相机\n摄影技巧指导\n2次潜水机会\n照片后期处理'),
            ]
            db.session.add_all(activities)
            print("已创建3个活动")
        
        # 创建潜水知识文章
        if Post.query.count() == 0:
            posts = [
                Post(title='初学者潜水指南', 
                    content='潜水是一项令人兴奋的水上活动，但对于初学者来说，可能会感到有些紧张。本文将为您提供一些基本的潜水指南，帮助您安全、愉快地开始潜水之旅。\n\n首先，选择一个有资质的潜水中心和教练非常重要。确保他们持有国际认可的潜水教练证书，并且有丰富的教学经验。\n\n其次，了解基本的潜水装备也很重要。潜水面镜、呼吸管、脚蹼是最基本的装备，而潜水服、BCD（浮力调节装置）、调节器和气瓶则是进行水肺潜水所必需的。\n\n第三，掌握基本的潜水技巧和安全知识。例如，如何调节呼吸、如何平衡耳压、如何控制浮力等。这些技巧将帮助您在水下更加舒适和安全。\n\n最后，记住潜水的黄金法则：永远不要独自潜水，始终与潜伴一起潜水。这是确保潜水安全的最基本原则。',
                    category='潜水知识', image='post1.jpg', created_at=datetime.now() - timedelta(days=30)),
                Post(title='潜水装备保养指南', 
                    content='正确保养您的潜水装备不仅可以延长其使用寿命，还能确保您在水下的安全。本文将为您提供一些潜水装备的保养指南。\n\n潜水后，应立即用淡水冲洗所有装备，尤其是接触海水的部分。海水中的盐分会腐蚀金属部件，损害橡胶和塑料材质。\n\n面镜和呼吸管应用温和的肥皂水清洗，然后彻底冲洗干净。避免使用含有酒精或其他化学物质的清洁剂，因为这些物质可能会损害面镜的硅胶部分。\n\n潜水服应翻转过来，用淡水冲洗内外两面，然后悬挂在阴凉处晾干。避免阳光直射，因为紫外线会使潜水服的氯丁橡胶老化。\n\nBCD应特别注意内部的冲洗。将淡水注入BCD的充气阀，然后摇晃BCD，使水充分接触内部所有部位。然后排出水，重复几次，确保内部的盐分被完全冲洗掉。\n\n调节器是最精密的潜水装备，需要特别小心处理。冲洗时，确保调节器的第一级上的防尘帽已经盖好，防止水进入高压气室。每年应由专业技师进行一次全面检查和维护。\n\n最后，所有装备应存放在干燥、阴凉的地方，避免阳光直射和极端温度。',
                    category='潜水知识', image='post2.jpg', created_at=datetime.now() - timedelta(days=20)),
                Post(title='了解减压病', 
                    content='减压病是潜水员可能面临的一种严重健康风险，了解其原因、症状和预防措施对于每位潜水员都至关重要。\n\n减压病，也称为"潜水夫病"，是由于潜水员上升过快，导致体内溶解的氮气来不及正常排出，形成气泡，阻塞血管或损伤组织而引起的疾病。\n\n减压病的症状多种多样，可能包括关节疼痛（常被称为"弯曲"）、皮肤瘙痒和斑点、极度疲劳、头晕、麻木或刺痛感、呼吸困难、胸痛、视力问题、混乱或记忆丧失等。这些症状通常在潜水后几分钟到几小时内出现，但有时可能延迟到24小时或更长时间。\n\n预防减压病的关键是遵循安全的潜水规则：遵守潜水表或潜水电脑的指示，控制上升速度（通常建议不超过每分钟18米），进行安全停留，避免在一天内进行多次深潜，避免在潜水后立即进行剧烈运动或飞行。\n\n如果怀疑患有减压病，应立即寻求医疗帮助。初步处理包括提供100%氧气和大量液体，然后尽快送往配有高压氧舱的医疗设施进行治疗。\n\n记住，预防永远胜于治疗。通过接受正规的潜水培训，遵循安全的潜水规则，可以大大降低患减压病的风险。',
                    category='潜水知识', image='post3.jpg', created_at=datetime.now() - timedelta(days=10)),
                Post(title='公司成立五周年庆典活动', 
                    content='我们很高兴地宣布，The One Dive Club将于下个月举行成立五周年庆典活动！\n\n五年来，我们带领了数千名潜水爱好者探索了海底世界的奇妙，见证了无数人对潜水运动的热爱和成长。为了感谢大家的支持，我们特别准备了一系列精彩的庆祝活动。\n\n活动亮点：\n1. 五周年特别优惠：所有课程和活动享受8折优惠\n2. 会员专属抽奖：有机会赢取高端潜水装备和免费潜水课程\n3. 海洋保护公益活动：参与海滩清理，为保护海洋生态尽一份力\n4. 资深潜水员分享会：听取经验丰富的潜水员分享他们的潜水故事和技巧\n\n活动时间：2023年X月X日至X月X日\n活动地点：The One Dive Club总部\n\n期待与您一起庆祝这个特别的时刻！',
                    category='公司新闻', image='post4.jpg', created_at=datetime.now() - timedelta(days=5)),
            ]
            db.session.add_all(posts)
            print("已创建4篇文章")
        
        # 创建预订记录
        if Booking.query.count() == 0 and User.query.filter_by(is_admin=False).count() > 0 and Course.query.count() > 0 and Coach.query.count() > 0:
            users = User.query.filter_by(is_admin=False).all()
            courses = Course.query.all()
            coaches = Coach.query.all()
            
            # 为每个用户创建1-3个预订
            bookings = []
            for user in users:
                for _ in range(random.randint(1, 3)):
                    course = random.choice(courses)
                    coach = random.choice(coaches)
                    participants = random.randint(1, 4)
                    booking_date = datetime.now() + timedelta(days=random.randint(1, 30))
                    status = random.choice(['pending', 'confirmed', 'completed', 'cancelled'])
                    payment_status = 'paid' if status in ['confirmed', 'completed'] else 'unpaid'
                    
                    booking = Booking(
                        user_id=user.id,
                        coach_id=coach.id,
                        course_id=course.id,
                        booking_date=booking_date,
                        status=status,
                        participants=participants,
                        total_price=course.price * participants,
                        is_group=random.choice([True, False]),
                        created_at=datetime.now() - timedelta(days=random.randint(1, 15)),
                        payment_status=payment_status
                    )
                    bookings.append(booking)
            
            db.session.add_all(bookings)
            print(f"已创建{len(bookings)}个预订记录")
        
        # 提交所有更改
        db.session.commit()
        print("测试数据创建完成！")

if __name__ == "__main__":
    create_test_data()